package com.example.springgobang.aip;

import com.example.springgobang.model.User;
import com.example.springgobang.model.UserMapper;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserAPI {
    // 注入 userMapper 对象
    @Autowired
    private UserMapper userMapper;

    // @PostMapping :路由映射
    @PostMapping("/login")
    // @ResponseBody :返回响应
    @ResponseBody
    // login 方法是处理登录的逻辑
    public Object login(String username, String password, HttpServletRequest request) {
        // 关键操作,根据 username 去数据库进行查询.
        User user = userMapper.selectByName(username);
        // 如果能找到匹配的用户,并且密码也一致,就认为登录成功
        if (user == null || !user.getPassword().equals(password)) {
            // 登录失败
            System.out.println("登录失败!");
            return new User();
        }
        System.out.println("[login] user = " + username);
        // getSession() 方法中参数为 true 表示当会话存在直接返回,不存在就创建会话
        // 用户首次登录,允许创建会话
        HttpSession httpSession = request.getSession(true);
        // 把 user 保存到 session 中,以便下次访问服务器时,服务器可以正确识别出当前客户端对应的正确身份信息
        httpSession.setAttribute("user",user);
        return user;
    }

    @PostMapping("/register")
    @ResponseBody
    // register 方法是处理注册相关的逻辑
    public Object register(String username, String password) {
        // 为了预防注册失败(比如出现用户名重复的情况)
        // 这里用 try--catch 包住
        try {
            User user = new User();
            user.setUsername(username);
            user.setPassword(password);
            userMapper.insert(user);
            return userMapper.selectByName(username);
        } catch (org.springframework.dao.DuplicateKeyException e) {
            // 注册失败,返回一个空的 User 对象
            return new User();
        }
    }

    @GetMapping("/userInfo")
    @ResponseBody
    // getUserInfo 方法用来处理获取用户信息的操作
    public Object getUserInfo(HttpServletRequest request) {
        // 避免获取的用户信息不存在,用 try--catch 包住
        try {
            // getSession() 方法中参数为 false 表示当会话存在直接返回,不存在也不创建新会话
            // 由于这是用户登录后的操作,所以登录了就有会话,没登录就没有会话
            // 这也可以让我们感知到用户是否进行了登录
            HttpSession httpSession = request.getSession(false);
            // 从 session 中获取登录用户的信息
            User user = (User) httpSession.getAttribute("user");
            // 拿着这个 user 对象, 去数据库中找, 找到最新的数据
            // 然后给客户端返回最新的玩家数据信息
            return userMapper.selectByName(user.getUsername());
        } catch (NullPointerException e) {
            // 当前用户未登录, 直接返回一个空的 User 对象
            return new User();
        }
    }
}
